#include "tasks_manage.h"

#include "stdint.h"

#include "RTClock.h"
#include "Temperature.h"
#include "TempAlarm.h"
#include "ScreenUI.h"

typedef struct _TaskComponets
{
	uint8_t run;             // 程序运行标记：0-不运行，1运行
	uint8_t timer;           // 计时周期数
	uint8_t interval_time;   // 任务运行间隔时间
	void (*task_hook)(void); // 要运行的任务函数
} TaskComponets;

/**
 * @description:
 * 定义这个任务清单的目的
 * 其实就是参数TASKS_MAX的值，
 * 其他值是没有具体的意义的，
 * 只是为了清晰的表面任务的关系而已。
 */
typedef enum _TaskList
{
	UPDATE_RT_CLOCK,
	UPDATE_TEMP_DATA,
	TEMP_ALARM,
	REFRESH_SCREEN,
	// 这里添加你的任务 ...
	TASKS_MAX_NUM // 总的可供分配的定时任务数目
} TaskList;

/**
 * @description:
 * 初始化各任务的值，
 * 这些值的初始化，非常重要，
 * 跟具体的执行时间优先级等都有关系
 */
static TaskComponets TaskComps[] =
{
	{0, 1, 1, UpdateRTClock},
    { 0, 50, 50, UpdateTempData},
    { 0, TEMP_ALARM_RUN_INTERVAL_MS, TEMP_ALARM_RUN_INTERVAL_MS, TempAlarm},
	{0, 100, 100,RefreshScreen}
// 这里添加你的任务...
		};

/**
 * 对任务进行标记，tim3的中断处理函数中被调用
 * @description:
 * @param {*}
 * @return {*}
 */
void TaskRemarks(void)
{
	uint8_t i;
	for (i = 0; i < (uint8_t) TASKS_MAX_NUM; i++) // 逐个任务时间处理
	{
		if (TaskComps[i].timer) // 时间不为0
		{
			TaskComps[i].timer--;        // 减去一个节拍
			if (TaskComps[i].timer == 0) // 时间减完了
			{
				TaskComps[i].timer = TaskComps[i].interval_time; // 恢复计时器值，从新下一次
				TaskComps[i].run = 1;                            // 任务可以运行
			}
		}
	}
}

/**
 * 运行到时间的任务，在main函数主循环中被调用
 * @description:
 * @param {*}
 * @return {*}
 */
void TaskProcess(void)
{
	uint8_t i;
	for (i = 0; i < TASKS_MAX_NUM; i++) // 逐个任务时间处理
	{
		if (TaskComps[i].run) // 时间不为0
		{
			TaskComps[i].task_hook(); // 运行任务
			TaskComps[i].run = 0;     // 标志清0
		}
	}
}

